package cn.lingyangwl.agile.system.model.entity;

import cn.lingyangwl.agile.model.BasePlusPO;
import cn.lingyangwl.agile.model.constants.TenantCons;
import cn.lingyangwl.framework.mybatis.mate.annotations.FieldUniqueConfig;
import cn.lingyangwl.framework.mybatis.mate.enums.SqlConditionTypeEnum;
import com.baomidou.mybatisplus.annotation.*;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;

import java.io.Serializable;
import java.util.Date;

/**
 * 租户信息
 */
@TableName("sys_tenant")
@Getter
@Setter
@Accessors(chain = true)
@FieldUniqueConfig(sqlCondition = SqlConditionTypeEnum.OR)
public class SysTenant extends BasePlusPO implements Serializable {

    private static final long serialVersionUID = 1L;

    public static LambdaQueryWrapper<SysTenant> lqw() {
        return Wrappers.lambdaQuery();
    }
    public static LambdaUpdateWrapper<SysTenant> luw() {
        return Wrappers.lambdaUpdate();
    }

    /**
     * 编码
     */
    @TableId
    private String id;

    /**
     * 租户的管理员ID(拥有者)
     */
    private Long adminUserId;

    /**
     * 是否为管理端租户(管理某一个场景), 且一个场景下只能有一个管理租户类型, 当租户为管理类型时,
     * 子租户套餐和租户套餐可以为空
     */
    private Boolean isMgtSceneTenant;

    /**
     * 租户图标
     */
    private String logo;

    /**
     * 是否为系统内置, 系统内置的不能被删除
     */
    private Boolean sysBuiltIn;

    /**
     * 名称
     */
    private String name;

    /**
     * 开始时间
     */
    @TableField(updateStrategy = FieldStrategy.IGNORED)
    private Date beginTime;

    /**
     * 结束时间
     */
    @TableField(updateStrategy = FieldStrategy.IGNORED)
    private Date endTime;

    /**
     * 状态 1正常 0冻结
     * @see TenantCons.Status
     */
    private String status;

    @TableField(fill = FieldFill.INSERT)
    private Long createdUid;

    /**
     * 租户域名, 这里指的是二级域名, 比如test.lingyangwl.cn, 则这里为test
     */
    private String domain;

    /**
     * 租户套餐编号
     *
     * 关联 {@link SysTenantPackage#getId()}
     * 特殊逻辑：系统内置租户，不使用套餐
     */
    private Long packageId;

    /**
     * 子租户套餐id
     */
    private Long subPackageId;

    /**
     * 场景ID
     */
    private Long sceneId;

    /**
     * 主租户id
     */
    private String mainTenantId;

    /**
     * 是否为主租户
     */
    private Boolean isMainTenant;

    /**
     * 前端Select可能会用到
     */
    public String getLabel() {
        return this.name;
    }

    public String getValue() {
        return this.id;
    }

}
